#include "app_config.h"

#if APP_SELECT_EXAMPLE == 0
#include "polsys.h"
#include "board.h"


// 静态定义任务对象
static idata polsys_task_t mTask_LEDRun;
static idata polsys_task_t mTask_DoSome;
static idata polsys_task_t mTask_KEYScan;

static rt_thread_t mTh0;

// 内部函数申明

static void LED_Run();
static void DoSome();
static void KEY_Scan();
static void Th0Entry(void *p);

// 以下事件函数看起来像中断，但是都在主线程执行，可以执行耗时操作，但可能会拖慢整个软件的运行速度。

// 软件启动事件。软件启动执行一次，函数名由 polsys 确定，不可任意修改。（看成是中断服务函数）
void App_Load()
{
	Led_Init();
	Polsys_TaskInit(&mTask_LEDRun,LED_Run,500);	//初始化任务 mTask_LEDRun ， 入口为 LED_Run ，间隔100ms执行一次
	Polsys_TaskInit(&mTask_DoSome,DoSome,50);	
	Polsys_TaskInit(&mTask_KEYScan,KEY_Scan,30);	//间隔30ms执行一次

	mTh0 = rt_thread_create("Th0", Th0Entry, NULL, 1024, 0, 1);
	rt_thread_startup(mTh0);
}

static void LED_Run()		//间隔500ms执行一次，注意polsys任务首次执行同样需要等待，看成是软定时器
{
	static u32 polsys_count = 0;
	polsys_count++;
	// printf("[%s][printf]Polsys Task Run:%d\r\n", rt_thread_self()->name, polsys_count);// 重定义 fputc 函数才能使用
	rt_kprintf("[%s][rt_kprintf]Polsys Task Run:%d\r\n", rt_thread_self()->name, polsys_count);	// 使用 rt_kprintf 效果一样，但是更节省代码。

	if(Led_IsOn())Led_Off();
	else Led_On();
}

static void DoSome()
{
	//间隔50ms执行一次，看成是软定时器
}

static void KEY_Scan()
{
	//间隔30ms执行一次，看成是软定时器
	// Delay_ms(10);	// 注意，在多线程情况下，此函数阻塞当前线程(Polsys执行任务的线程)去执行其他线程，这不会影响其他线程的实时性，但是同样影响Polsys任务的实时性。
}

// Th0 线程入口
static void Th0Entry(void *p)
{
	static u32 th0_count = 0;
	while(1)
	{
		th0_count++;
		printf("[%s][printf]Rt-Thread Run:%d\r\n", rt_thread_self()->name, th0_count);// 重定义 fputc 函数才能使用
		// rt_kprintf("[%s][rt_kprintf]Rt-Thread Run:%d\r\n", rt_thread_self()->name, th0_count);
		rt_thread_mdelay(1000);
	}
}

#endif





